package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import Negocio.Lote;

public class AdmPersistenciaLote extends AdministradorPersistencia {
	private static AdmPersistenciaLote instancia;
	private AdmPersistenciaLoteSimple LoteSimplePersistencia;
	private AdmPersistenciaLoteCompuesto LoteCompuestoPersistencia;

	private AdmPersistenciaLote() {
		LoteSimplePersistencia = AdmPersistenciaLoteSimple.getInstancia();
		LoteCompuestoPersistencia = AdmPersistenciaLoteCompuesto.getInstancia();

	}

	public static AdmPersistenciaLote getInstancia() {
		if (instancia == null)
			instancia = new AdmPersistenciaLote();
		return instancia;
	}

	public int generarCodigo() {
		System.out
				.println("LOG: AdmPersistenciaCerealCosechaFina / Generar Codigo... [INI]");
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("Select max(codigo) from Lote");
			ResultSet res = s.executeQuery();
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return res.getInt(1) + 1;

		} catch (Exception e) {
			// TODO Exception
			System.out.println(e.getMessage());

		}
		return 0;

	}

	@Override
	public void borrar(Object d) {

		LoteSimplePersistencia.borrar(d);
		LoteCompuestoPersistencia.borrar(d);

	}

	@Override
	public Object buscarPorCodigo(Object o) {

		Lote l = (Lote) LoteSimplePersistencia.buscarPorCodigo(o);

		if (l == null)
			l = (Lote) LoteCompuestoPersistencia.buscarPorCodigo(o);

		return l;
	}

	@Override
	@Deprecated
	public Long insertar(Object o) {
		return null;
	}

	@Override
	public Vector<Object> buscarTodos() {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where estado = 's' ");
			ResultSet rta = s.executeQuery();
			Vector<Object> l = new Vector<Object>();
			while (rta.next()) {

				l.add(rta.getLong(1));
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return l;
		} catch (Exception e) {
			// TODO Exception
			System.out.println("No se encuentra el lote");
		}
		return null;
	}
	public Vector<Object> buscarTodosdis() {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where loteQueCompone = 0 and estado = 's' ");
			ResultSet rta = s.executeQuery();
			Vector<Object> l = new Vector<Object>();
			while (rta.next()) {

				l.add(rta.getLong(1));
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return l;
		} catch (Exception e) {
			// TODO Exception
			System.out.println("No se encuentra el lote");
		}
		return null;
	}

	@Override
	@Deprecated
	public void modificar(Object o) {

	}

	public void asignarLoteComponente(long codigo, Collection<Lote> o) {
		try {
			System.out.println("Log: AdmPersistenciaLoteSimple / asignarLoteComponente [INI]");
			Connection con = PoolConnection.getPoolConnection().getConnection();

			// Desasignar a todos los lotes que componian anteriormente.
			PreparedStatement s = con
					.prepareStatement("update  Lote set loteQueCompone = 0 where loteQueCompone = ?");
			s.setLong(1, codigo);
			s.execute();

			String lotes = "(";

			Iterator<Lote> it = o.iterator();
			int count = 0;
			while (it.hasNext()) {
				count++;
				lotes = lotes + String.valueOf(it.next().getCodigo());
				if (it.hasNext())
					lotes = lotes + ",";
				else
					lotes = lotes + ")";
			}
			s = con
					.prepareStatement("update  Lote set loteQueCompone = ? where codigo in "
							+ lotes);
			System.out
					.println("Excecute query : update Lote set loteQueCompone ="
							+ codigo + "where codigo in " + lotes);
			s.setLong(1, codigo);

			if (count > 0)
				s.execute();
			else {
				con.rollback();
				System.out
						.println("Error: No hay lotes, no se pudo ejecutar asignarLoteComponente");
			}
			System.out.println("Ejecuto");
			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out
				.println("Log: AdmPersistenciaLoteSimple / asignarLoteComponente [FIN]");
	}

	public void desasignarLoteComponente(long codigo, Collection<Lote> o) {

		System.out
				.println("Log: AdmPersistenciaLoteSimple / asignarLoteComponente [INI]");
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Desasignar a todos los lotes que componian anteriormente.
		PreparedStatement s;
		try {
			s = con
					.prepareStatement("update  Lote set loteQueCompone = 0 , tipo = 's' where loteQueCompone = ?");

			s.setLong(1, codigo);
			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	

	public static Collection<Lote> buscarPorLoteComponente(long o) {
		Collection<Lote> l = new Vector<Lote>();

		l.addAll(AdmPersistenciaLoteSimple.getInstancia()
				.buscarPorLoteComponente(o));
		l.addAll(AdmPersistenciaLoteCompuesto.getInstancia()
				.buscarPorLoteComponente(o));
		return l;
	}

	public Vector<Lote> buscarTodosPorSiembra(long o) {
		Vector<Lote> l = new Vector<Lote>();

		l.addAll(AdmPersistenciaLoteSimple.getInstancia()
				.buscarPorLoteSiembra(o));
		l.addAll(AdmPersistenciaLoteCompuesto.getInstancia()
				.buscarPorLoteSiembra(o));
		return l;
	}

}
